Java与Python通过gRPC通信

您所在的位置:网站首页 grpc 实现 Java与Python通过gRPC通信

Java与Python通过gRPC通信

2024-07-16 04:44:02| 来源: 网络整理| 查看: 265

Java端

gRPC默认通过Protobuf进行数据传输。Protobuf提供一种灵活、高效、自动化的机制,用于序列化结构数据。Protobuf仅需自定义一次所需要的数据格式,然后我们就可以使用Protobuf编译器自动生成各种语言的源码,方便我们读写自定义的格式化数据。

在idea安装插件

配置maven文件

主要是添加protobuf和grpc包的引用以及插件。

protobuf和grpc的引用为:

com.google.protobuf protobuf-java 3.5.1 io.grpc grpc-all 1.12.0

生成protobuf和grpc接口插件配置

org.xolstice.maven.plugins protobuf-maven-plugin 0.5.0 com.google.protobuf:protoc:3.0.0:exe:${os.detected.classifier} grpc-java io.grpc:protoc-gen-grpc-java:1.0.0:exe:${os.detected.classifier} compile compile-custom

完整配置文件

4.0.0 org.springframework.boot spring-boot-starter-parent 2.5.5 com.example grpcdemo 0.0.1-SNAPSHOT grpcdemo Demo project for Spring Boot 1.8 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test com.google.protobuf protobuf-java 3.5.1 io.grpc grpc-all 1.12.0 org.springframework.boot spring-boot-autoconfigure 2.5.5 org.springframework.boot spring-boot 2.5.5 kr.motd.maven os-maven-plugin 1.4.1.Final org.xolstice.maven.plugins protobuf-maven-plugin 0.5.0 com.google.protobuf:protoc:3.0.0:exe:${os.detected.classifier} grpc-java io.grpc:protoc-gen-grpc-java:1.0.0:exe:${os.detected.classifier} compile compile-custom

定义一个接口服务文件(*.proto),这个文件需要放到与main/java同级位置,可以创建文件夹。

 下面是一个示例文件calc.proto的内容

syntax = "proto3"; option java_multiple_files = false; option java_package = "com.example.grpcdemo.grpc.calc"; option java_outer_classname = "PhmCalcProto"; // option objc_class_prefix = "Hello"; package com.example.grpcdemo.grpc.calc; //定义服务 service PhmCalcService { //注意:这里是returns 不是return rpc calc (PhmCalcRequest) returns (PhmCalcResponse) { } } //定义请求数据结构 message PhmCalcRequest { string calcName = 1; string calcCode = 2; string calcParams = 3; } //定义返回数据结构 message PhmCalcResponse { string status = 1; string code = 2; string message = 3; string data = 4; }

这里定义了一个服务接口“PhmCalcService”和两个传输对象“PhmCalcRequest”与“PhmCalcResponse”。

通过maven的install生成protobuf的接口模板文件

点击运行完成后,会在工程里面生成一个target文件夹(需要打开) 

 在target文件夹中,包含示例程序,接口模板java文件。

拷贝模板代码到工程中

 

为避免类冲突,可以将模板“target”文件夹删除或移走备份。

编写客户端请求测试类

package com.example.grpcdemo; import com.example.grpcdemo.grpc.calc.PhmCalcProto; import com.example.grpcdemo.grpc.calc.PhmCalcServiceGrpc; import io.grpc.ManagedChannel; import io.grpc.ManagedChannelBuilder; import java.util.concurrent.TimeUnit; /** * @author Administrator */ public class PhmCalcTestClient { private final ManagedChannel channel; private final PhmCalcServiceGrpc.PhmCalcServiceBlockingStub blockingStub; private static final String GRPC_SERVER_HOST = "127.0.0.1"; private static final int GRPC_SERVER_PORT = 50051; public PhmCalcTestClient(String host, int port) { // usePlaintext表示明文传输,否则需要配置ssl, channel 表示通信通道 channel = ManagedChannelBuilder.forAddress(host, port).usePlaintext(true).build(); // 存根,用于调用服务端的接口方法。 blockingStub = PhmCalcServiceGrpc.newBlockingStub(channel); } public void shutdown() throws InterruptedException { channel.shutdown().awaitTermination(5, TimeUnit.SECONDS); } public void testResult() { PhmCalcProto.PhmCalcRequest request = PhmCalcProto.PhmCalcRequest.newBuilder() .setCalcCode("code123") .setCalcName("name123") .setCalcParams("{\"p1\":\"p1Value\"}").build(); System.out.println("request: "); System.out.println(request.toString()); PhmCalcProto.PhmCalcResponse response = blockingStub.calc(request); System.out.println("response: "); System.out.println(response.toString()); } public static void main(String[] args) { PhmCalcTestClient client = new PhmCalcTestClient(GRPC_SERVER_HOST, GRPC_SERVER_PORT); client.testResult(); } }

 Python端

新建Python代码工程,如果没有安装,则先安装Python。

Python端的gRPC服务模板代码我们不在IDE工具中生成,使用Python的一个工具插件来完成。

安装python的grpc运行时,命令行执行

pip install grpcio 使用 protoc 编译 proto 文件, 生成 python 语言的实现

安装grpc工具,命令行执行

pip install grpcio-tools

编辑protobuf文件,生成服务模板代码。将上一步JAVA中定义的同一个protobuf文件“calc.proto”拷贝到Python工程目录,命令行定位到proto目录,执行命令

python -m grpc_tools.protoc --python_out=. --grpc_python_out=. -I. calc.proto

编译后将生成代码calc_pb2.py和calc_pb2_grpc.py文件。

编写服务端测试类calcServer.py

 

from concurrent import futures import time import grpc import calc_pb2 import calc_pb2_grpc # 实现 proto 文件中定义的 PhmCalcServiceService class CalcServer(calc_pb2_grpc.PhmCalcServiceServicer): # 实现 proto 文件中定义的 rpc 调用 def calc(self, request, context): print("request: ") print(request) # 通过实际计算得出结果。 # ... response = calc_pb2.PhmCalcResponse(status="0", message="success", data="{\"p2\": \"p2Value\"}") print("response: ") print(response) return response def serve(): # 启动 rpc 服务 server = grpc.server(futures.ThreadPoolExecutor(max_workers=10)) calc_pb2_grpc.add_PhmCalcServiceServicer_to_server(CalcServer(), server) server.add_insecure_port('[::]:50051') server.start() try: while True: time.sleep(60*60*24) # one day in seconds except KeyboardInterrupt: server.stop(0) if __name__ == '__main__': serve()



【本文地址】

公司简介

联系我们

今日新闻


点击排行

实验室常用的仪器、试剂和
说到实验室常用到的东西,主要就分为仪器、试剂和耗
不用再找了,全球10大实验
01、赛默飞世尔科技(热电)Thermo Fisher Scientif
三代水柜的量产巅峰T-72坦
作者:寞寒最近,西边闹腾挺大,本来小寞以为忙完这
通风柜跟实验室通风系统有
说到通风柜跟实验室通风,不少人都纠结二者到底是不
集消毒杀菌、烘干收纳为一
厨房是家里细菌较多的地方,潮湿的环境、没有完全密
实验室设备之全钢实验台如
全钢实验台是实验室家具中较为重要的家具之一,很多

推荐新闻


图片新闻

实验室药品柜的特性有哪些
实验室药品柜是实验室家具的重要组成部分之一,主要
小学科学实验中有哪些教学
计算机 计算器 一般 打孔器 打气筒 仪器车 显微镜
实验室各种仪器原理动图讲
1.紫外分光光谱UV分析原理:吸收紫外光能量,引起分
高中化学常见仪器及实验装
1、可加热仪器:2、计量仪器:(1)仪器A的名称:量
微生物操作主要设备和器具
今天盘点一下微生物操作主要设备和器具,别嫌我啰嗦
浅谈通风柜使用基本常识
 众所周知,通风柜功能中最主要的就是排气功能。在

专题文章

    CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭